package com.qdu.Dao.impl;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.qdu.Dao.BaseDao;
import com.qdu.util.DatabaseUtil;
import com.qdu.Dao.BaseDao;

public class BaseDaoImpl implements BaseDao {

    @Override
    public int executeUpdate(String sql, Object... params) {

        //从basedaoimpl中重写executeupdate，后边执行可变参数会更加便捷。
        //param[]数组用于存储可变参数的值。
        //con对象用于连接数据库
        Connection con=null;
        PreparedStatement ps=null;


        //定义rows变量存储返回值，表示受影响的行数
        int rows=0;

        try {

            con=DatabaseUtil.getConnection();

            ps=con.prepareStatement(sql);

            for(int i=0;i<params.length;i++) {
                /*
                 * 设置第i+1个参数的值是数组中的i+1.
                 * 数组的遍历从0开始，sql语句？的索引从1开始.
                 * 所以传入参数要用i+1
                 * 遍历一下传入的每个sql语句需要的值，设置为对应的？的值
                 *
                 */
                ps.setObject(i+1, params[i]);
            }

            rows=ps.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DatabaseUtil.close(null, ps, con);
        }

        return rows;
    }



    @Override
    public Object[] getOne(String sql, Object... params) {
        Connection con=null;
        PreparedStatement ps=null;
        ResultSet rs=null;

        con=DatabaseUtil.getConnection();

        //定义一个数组用于存储查询结果
        Object[] data=null;

        try {
            ps=con.prepareStatement(sql);
            for(int i=0;i<params.length;i++) {
                ps.setObject(i+1, params[i]);
            }

            //执行查询，获得结果集
            rs=ps.executeQuery();
            //count变量记录查询到的列的数量
            int count=rs.getMetaData().getColumnCount();
            data=new Object[count];
            if(rs.next()) {
                for(int i=0;i<count;i++) {
                    data[i]=rs.getObject(i+1);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DatabaseUtil.close(rs, ps, con);
        }

        return data;
    }

    @Override
    public List<Object[]> getMany(String sql, Object... params) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        con = DatabaseUtil.getConnection();

        List<Object[]> list=new ArrayList<>();

        try {
            ps = con.prepareStatement(sql);

            for (int i = 0; i < params.length; i++) {
                // 设置第i+1个参数的值为数组中的第i+1个值
                // 数组的索引从0开始，sql语句的?的索引从1开始
                // 遍历一下传入的每个sql语句需要的参数的值，设置为对应的?的值
                ps.setObject(i + 1, params[i]);
            }

            // 执行查询，获得结果集
            rs = ps.executeQuery();

            int count=rs.getMetaData().getColumnCount(); //获取查询到的列的数量

            // 循环读取每一行记录
            while (rs.next()) {

                Object[] data=new Object[count];

                for(int i=0;i<count;i++) {
                    data[i]=rs.getObject(i+1); //获取对应列的数据，存入数组
                }

                list.add(data);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DatabaseUtil.close(rs, ps, con);
        }

        return list; //返回存储查询结果的表
    }



}
